package com.ldu.houserent.controller.backend;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ldu.houserent.common.base.BaseController;
import com.ldu.houserent.common.dto.JsonResult;
import com.ldu.houserent.common.enums.HouseStatusEnum;
import com.ldu.houserent.common.enums.OrderStatusEnum;
import com.ldu.houserent.common.util.DateUtil;
import com.ldu.houserent.common.util.PageUtil;
import com.ldu.houserent.entity.House;
import com.ldu.houserent.entity.Order;
import com.ldu.houserent.service.HouseService;
import com.ldu.houserent.service.OrderService;
import com.ldu.houserent.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.Objects;

/**
 * 后端订单控制器
 */
@Controller("backendOrderController")
@RequestMapping("/admin/order")
public class OrderController extends BaseController {

    @Autowired
    private OrderService orderService;
    @Autowired
    private HouseService houseService;
    @Autowired
    private UserService userService;

    /*
        进入订单列表
     */
    @RequestMapping("")
    public String allOrder(@RequestParam(value = "page",defaultValue = "1")Long pageNumber, @RequestParam(value = "size",defaultValue = "6")Long pageSize, Model model){
        //封装page
        Page page= PageUtil.initMpPage(pageNumber,pageSize);
        Order condition = new Order();
        //如果登录用户是租客，则查询该租客的订单
        if (loginUserIsCustomer()){
            condition.setCustomerUserId(getLoginUserId());
        }
        //如果登录用户是房东，则查询该房东的订单
        if (loginUserIsOwner()){
            Long var=getLoginUserId();
            condition.setOwnerUserId(var);
        }

        Page<Order> orderPage = orderService.findAll(page,condition);
        for (Order order:orderPage.getRecords()){   //遍历当前页面的每一项
            order.setHouse(houseService.get(order.getHouseId()));
            order.setOwnerUser(userService.get(order.getOwnerUserId()));
            order.setCustomerUser(userService.get(order.getCustomerUserId()));
        }
        model.addAttribute("pageInfo",orderPage);
        model.addAttribute("tab","order-list");         //鼠标点击后，改变页面中的字体颜色样式
        model.addAttribute("pagePrefix","/admin/order?");       //实现翻页
        return "admin/order-list";
    }//allOrder

    /*
        取消订单
     */
    @RequestMapping(value = "/cancel", method = RequestMethod.POST)         //url地址拼接该类的RequestMapping+该方法的RequestMapping，即/admin/order+/cancel
    @ResponseBody
    public JsonResult cancelOrder(@RequestParam("orderId")Long orderId){
        //校验订单是否存在，如果订单不存在，则不可以取消
        Order order=orderService.get(orderId);
        if (order==null){
            return JsonResult.error("订单不存在");
        }
        //登录用户不是管理员，也不是该订单的租客，也不是该订单的房东，则无权取消订单
        if (!loginUserIsAdmin() && !Objects.equals(getLoginUserId(),order.getCustomerUserId()) && !Objects.equals(getLoginUserId(),order.getOwnerUserId())){
            return JsonResult.error("您没有权限取消该订单");
        }
        //判断都完成后，则有权限取消该订单了，把订单的状态修改为取消状态，然后在数据库中update更新一下
        order.setStatus(OrderStatusEnum.CUSTOMER_CANCEL.getValue());
        orderService.update(order);
        return JsonResult.success("订单取消成功");
    }//cancelOrder

    /*
        申请退租
     */
    @RequestMapping(value = "/end", method = RequestMethod.POST)         //url地址拼接该类的RequestMapping+该方法的RequestMapping，即/admin/order+/cancel
    @ResponseBody
    public JsonResult endOrder(@RequestParam("orderId")Long orderId){
        //校验订单是否存在，如果订单不存在，则不可以取消
        Order order=orderService.get(orderId);
        if (order==null){
            return JsonResult.error("订单不存在");
        }
        //登录用户不是管理员，也不是该订单的租客，也不是该订单的房东，则无权申请退租
        if (!loginUserIsAdmin() && !Objects.equals(getLoginUserId(),order.getCustomerUserId()) && !Objects.equals(getLoginUserId(),order.getOwnerUserId())){
            return JsonResult.error("您没有权限申请退租");
        }
        //判断都完成后，则有权限申请退租了，把订单的状态修改为申请退租状态，然后在数据库中update更新一下
        order.setStatus(OrderStatusEnum.END_APPLY.getValue());
        orderService.update(order);
        return JsonResult.success("退租申请中，请联系房东审批");
    }//endOrder

    /*
        退租申请通过
     */
    @RequestMapping(value = "/endPass", method = RequestMethod.POST)         //url地址拼接该类的RequestMapping+该方法的RequestMapping，即/admin/order+/cancel
    @ResponseBody
    public JsonResult endOrderPass(@RequestParam("orderId")Long orderId){
        //校验订单是否存在，如果订单不存在，则不可以取消
        Order order=orderService.get(orderId);
        if (order==null){
            return JsonResult.error("订单不存在");
        }
        //登录用户不是管理员，也不是该订单的房东，则无权处理退租申请
        if (!loginUserIsAdmin() && !Objects.equals(getLoginUserId(),order.getOwnerUserId())){
            return JsonResult.error("您没有权限处理退租申请");
        }
        //判断都完成后，则有权限处理退租申请了，退租申请审核通过，把订单的状态修改为已到期状态，再给订单添加几条数据内容，然后在数据库中update更新一下
        //1.修改订单的状态
        order.setStatus(OrderStatusEnum.FINISH.getValue());         //退租申请通过，订单修改为已到期
        Date date = new Date();
        //将订单持续时间set到数据库中
        int dayNum = DateUtil.daysBetween(order.getStartDate(),date);
        order.setDayNum(dayNum);
        //将订单总金额set到数据库中
        order.setTotalAmount(order.getMonthRent()/30*dayNum);
        //将订单当前日期set到数据库中
        order.setEndDate(date);
        orderService.update(order);
        //2.修改房屋的状态，重置为未租出
        House house = houseService.get(order.getHouseId());     //获取到当前的房屋
        if (house!=null && Objects.equals(house.getStatus(), HouseStatusEnum.HAS_RENT.getValue())){
            house.setStatus(HouseStatusEnum.NOT_RENT.getValue());
            house.setLastOrderEndTime(date);
            houseService.update(house);
        }
        return JsonResult.success("退租成功");
    }//endOrderPass

    /*
        退租申请驳回
     */
    @RequestMapping(value = "/endReject", method = RequestMethod.POST)         //url地址拼接该类的RequestMapping+该方法的RequestMapping，即/admin/order+/cancel
    @ResponseBody
    public JsonResult endOrderReject(@RequestParam("orderId")Long orderId){
        //校验订单是否存在，如果订单不存在，则不可以取消
        Order order=orderService.get(orderId);
        if (order==null){
            return JsonResult.error("订单不存在");
        }
        //登录用户不是管理员，也不是该订单的房东，则无权处理退租申请
        if (!loginUserIsAdmin() && !Objects.equals(getLoginUserId(),order.getOwnerUserId())){
            return JsonResult.error("您没有权限处理退租申请");
        }
        //判断都完成后，则有权限处理退租申请了，退租申请审核通过，把订单的状态修改为退租申请驳回状态，然后在数据库中update更新一下
        order.setStatus(OrderStatusEnum.END_APPLY_REJECT.getValue());
        orderService.update(order);
        return JsonResult.success("操作成功");
    }//endOrderReject

}
